MODULE ExtObFix;

(*$R-,S-*)
FROM SYSTEM     IMPORT ADDRESS, ADR, BYTE, CADR, ASSEMBLER, CALLSYS;

IMPORT MagicVDI;
IMPORT MagicAES;
IMPORT mtAppl;
IMPORT mtArea;
IMPORT mtRsc;
IMPORT mtMenubase;
IMPORT mtXobjects;
IMPORT mtPopups;
IMPORT mtDials;
IMPORT mtAlerts;
IMPORT StrConv;
IMPORT MagicStrings;

(*$Z+*)
TYPE Rectangle = RECORD
                  x, y, w, h : INTEGER
                 END;

TYPE    tObjcTree =     POINTER TO ARRAY [0..MAX(INTEGER)] OF MagicAES.OBJECT;

(*----------------------------------------------------------------------*
 *        Resource-Coder 1.03  (C)92 by Peter Hellinger Software        *
 *----------------------------------------------------------------------*
 *           Inline-Resource erzeugt am 15.10.1993 12:56:34             *
 *----------------------------------------------------------------------*)
 
TYPE tRscData = ARRAY [0..557] OF CARDINAL;
 
CONST RscData = tRscData {
        00000H, 00028H, 001D8H, 001D8H, 001D8H, 001D8H, 001D8H, 0045AH, 0045AH, 
        00024H, 00012H, 00001H, 00000H, 00000H, 00000H, 00000H, 00000H, 0045AH, 
        00000H, 00028H, 0FFFFH, 00001H, 00011H, 00014H, 00400H, 00090H, 00002H, 
        01100H, 00000H, 00000H, 0003AH, 00018H, 00002H, 0FFFFH, 0FFFFH, 01119H, 
        00040H, 00010H, 000FFH, 01101H, 00038H, 00000H, 00002H, 00001H, 00003H, 
        0FFFFH, 0FFFFH, 0131AH, 00000H, 00000H, 00000H, 001D8H, 00002H, 00001H, 
        00035H, 00001H, 00004H, 0FFFFH, 0FFFFH, 0001CH, 00000H, 00000H, 00000H, 
        00204H, 00002H, 00003H, 0001FH, 00001H, 00005H, 0FFFFH, 0FFFFH, 0001CH, 
        00000H, 00000H, 00000H, 00224H, 00002H, 00004H, 0002BH, 00001H, 00006H, 
        0FFFFH, 0FFFFH, 0131CH, 00000H, 00080H, 00000H, 00250H, 00002H, 00805H, 
        0002CH, 00001H, 00007H, 0FFFFH, 0FFFFH, 0001CH, 00000H, 00000H, 00000H, 
        0027DH, 00002H, 00007H, 0002EH, 00001H, 00008H, 0FFFFH, 0FFFFH, 0001CH, 
        00000H, 00000H, 00000H, 002ACH, 00002H, 00008H, 0002BH, 00001H, 00009H, 
        0FFFFH, 0FFFFH, 0001CH, 00000H, 00000H, 00000H, 002D8H, 00002H, 00009H, 
        0002AH, 00001H, 0000AH, 0FFFFH, 0FFFFH, 0001CH, 00000H, 00000H, 00000H, 
        00303H, 00002H, 0000BH, 00035H, 00001H, 0000BH, 0FFFFH, 0FFFFH, 0001CH, 
        00000H, 00000H, 00000H, 00339H, 00002H, 0000EH, 00019H, 00001H, 0000CH, 
        0FFFFH, 0FFFFH, 0001CH, 00000H, 00000H, 00000H, 00353H, 00002H, 0000FH, 
        00019H, 00001H, 0000DH, 0FFFFH, 0FFFFH, 0001CH, 00000H, 00000H, 00000H, 
        0036DH, 00002H, 00010H, 0001AH, 00001H, 0000EH, 0FFFFH, 0FFFFH, 0121AH, 
        00607H, 00080H, 00000H, 00388H, 0002EH, 00016H, 00009H, 00001H, 0000FH, 
        0FFFFH, 0FFFFH, 0001CH, 00000H, 00000H, 00000H, 0038CH, 00002H, 0000CH, 
        00035H, 00001H, 00010H, 0FFFFH, 0FFFFH, 0001CH, 00000H, 00000H, 00000H, 
        003C2H, 00002H, 00012H, 00031H, 00001H, 00011H, 0FFFFH, 0FFFFH, 0001CH, 
        00000H, 00000H, 00000H, 003F4H, 00002H, 00013H, 00034H, 00001H, 00000H, 
        0FFFFH, 0FFFFH, 0001CH, 00020H, 00000H, 00000H, 00429H, 00002H, 00014H, 
        00030H, 00001H, 04869H, 06C66H, 06520H, 08162H, 06572H, 02065H, 07277H, 
        06569H, 07465H, 07274H, 06520H, 04D61H, 06769H, 06344H, 06961H, 06C2DH, 
        04F62H, 06A65H, 06B74H, 07479H, 07065H, 06E00H, 04265H, 06C69H, 06562H, 
        06967H, 06572H, 0204DH, 06F76H, 06572H, 03A20H, 03137H, 02C20H, 0544FH, 
        05543H, 04845H, 05849H, 05400H, 0466CH, 07944H, 06961H, 06C2DH, 04563H, 
        06B65H, 02020H, 02020H, 03A20H, 07A75H, 07384H, 0747AH, 06C69H, 06368H, 
        02049H, 0424FH, 0582CH, 0204FH, 05554H, 04C49H, 04E45H, 04400H, 05461H, 
        07374H, 06174H, 07572H, 06265H, 06469H, 0656EH, 06261H, 07265H, 0204FH, 
        0626AH, 0656BH, 07465H, 02028H, 0616CH, 06C65H, 02053H, 0454CH, 04543H, 
        05441H, 0424CH, 04529H, 00052H, 06164H, 0696FH, 06275H, 07474H, 06F6EH, 
        02020H, 03A20H, 03138H, 02C20H, 04255H, 05454H, 04F4EH, 0206FH, 06465H, 
        07220H, 05354H, 05249H, 04E47H, 02C20H, 05242H, 05554H, 0544FH, 04E00H, 
        04368H, 06563H, 06B62H, 06F78H, 02020H, 02020H, 0203AH, 02031H, 0382CH, 
        02042H, 05554H, 0544FH, 04E20H, 0287EH, 05242H, 05554H, 0544FH, 04E2CH, 
        0207EH, 04558H, 04954H, 02900H, 04578H, 06974H, 06275H, 07474H, 06F6EH, 
        02020H, 0203AH, 02031H, 0382CH, 02042H, 05554H, 0544FH, 04E2CH, 02045H, 
        05849H, 05420H, 02821H, 05242H, 05554H, 0544FH, 04E29H, 00055H, 06E64H, 
        06F62H, 07574H, 0746FH, 06E20H, 02020H, 03A20H, 07A75H, 07384H, 0747AH, 
        06C69H, 06368H, 0206EH, 06F63H, 06820H, 06F62H, 05F66H, 06C61H, 06773H, 
        02042H, 06974H, 02031H, 03420H, 07365H, 0747AH, 0656EH, 00053H, 07065H, 
        06354H, 06578H, 07420H, 02020H, 02020H, 03A20H, 03139H, 02C20H, 05354H, 
        05249H, 04E47H, 00046H, 07261H, 06D65H, 0426FH, 07820H, 02020H, 02020H, 
        03A20H, 03230H, 02C20H, 04255H, 05454H, 04F4EH, 00043H, 06972H, 0636CH, 
        06562H, 07574H, 0746FH, 06E20H, 03A20H, 03232H, 02C20H, 0424FH, 05843H, 
        04841H, 05200H, 05B4FH, 04B00H, 04865H, 06C70H, 06275H, 07474H, 06F6EH, 
        02020H, 0203AH, 0207AH, 07573H, 08474H, 07A6CH, 06963H, 06820H, 06E6FH, 
        06368H, 0206FH, 0625FH, 0666CH, 06167H, 07320H, 04269H, 07420H, 03135H, 
        02073H, 06574H, 07A65H, 06E00H, 04265H, 06920H, 06465H, 06E20H, 04F62H, 
        06A65H, 06B74H, 07479H, 07065H, 06E20H, 05370H, 06563H, 05465H, 07874H, 
        02075H, 06E64H, 02046H, 07261H, 06D65H, 0426FH, 07820H, 06973H, 07420H, 
        06469H, 06500H, 04461H, 07273H, 07465H, 06C6CH, 0756EH, 06720H, 06162H, 
        06884H, 06E67H, 06967H, 02076H, 06F6DH, 0204FH, 0626AH, 0656BH, 07473H, 
        07461H, 07475H, 0732EH, 0204CH, 06569H, 06465H, 07220H, 07265H, 06963H, 
        06874H, 00068H, 06965H, 07220H, 06465H, 07220H, 0506CH, 06174H, 07A20H, 
        06E69H, 06368H, 0742CH, 02075H, 06D20H, 06461H, 07320H, 0616CH, 06C65H, 
        07320H, 06461H, 0727AH, 07573H, 07465H, 06C6CH, 0656EH, 02E00H, 00000H

        }; (* Ende RscData *)
(*----------------------------------------------------------------------*)

(* Eigener Stack, da MM2 den Stack auf A3 liegen hat und der von
 * Interface wohl nicht initialisiert wird
 *)

VAR myStack : ARRAY [0..2047] OF BYTE;
                 
PROCEDURE TestForm(tree : tObjcTree; editobj: INTEGER; get_n : ADDRESS; window : ADDRESS);
  VAR r : Rectangle;
      usr, but : INTEGER;
      name: ARRAY[0..59] OF CHAR;
      alt : ARRAY [0..127] OF CHAR;
BEGIN
  IF mtDials.NewDial (tree)                  (* Neuen Dialog erzeugen *)
  THEN
    mtDials.DialCenter (tree, mtDials.CSCREEN, 0, 0, r);     (* zentrieren *)
    mtDials.DialForm (tree, mtDials.DSTART, r, r);           (* Bildschirm reservieren *)
    REPEAT
      mtDials.DialDraw (tree, 0, 99, r, FALSE);              (* Dialog zeichnen *)
      but := mtDials.DialDo (tree, editobj);                 (* FormDo-Ersatz   *)
      (* Button deselektieren *)
      EXCL (tree^[but].obState, MagicAES.SELECTED);
      (* Jetzt getName aufrufen mit TC-Parametern *)
      ASSEMBLER
        MOVEM.L D0-A6,-(SP)     ; Register sichern 
        MOVE.W  but(A6),D0      ; Button nach D0
        MOVE.L  window(A6),A0   ; window nach A0
        LEA     name(A6),A1     ; name nach A1
        MOVE.L  get_n(A6),A2    ; get_n nach A2
        JSR     (A2)            ; Procedure aufrufen
        MOVEM.L (SP)+,D0-A6     ; Register restaurieren
      END;
      (* Jetzt String zusammenbauen *)
      MagicStrings.Assign ("[0][Exitbutton:|",alt);
      MagicStrings.Append (StrConv.IntToStr (but,0), alt);
      MagicStrings.Append (" = '", alt);
      MagicStrings.Append (name, alt);
      MagicStrings.Append ("'|][[Abbruch|[Weiter]", alt);
    UNTIL mtAlerts.Alert (2, alt) = 1;                    (* Alert ausgeben *)
    mtDials.DialForm (tree, mtDials.DFINISH, r, r);       (* Bildschirm freigeben *)
    mtDials.DisposeDial (tree);                           (* und Dialog freigeben *)
  END;
END TestForm;


(* Zwischenprozeduren, die mit TC-Register�bergabe aufgerufen werden *)

(*$L- keinen Eintrittscode f�r die Prozedur erzeugen *)

(*
LOCAL VOID test_form (tree, editobj, get_n, window)
OBJECT *tree;   A0
WORD   editobj; D0
LONG   get_n;   D1
VOID   *window; A1
*)

PROCEDURE testForm ();
BEGIN
  ASSEMBLER
    MOVEM.L D1-A6,-(SP)
    LEA     myStack,A3  ; Stack einrichten f�r MM2
    MOVE.L  A0,(A3)+    ; Parameter umkopieren 
    MOVE.W  D0,(A3)+
    MOVE.L  D1,(A3)+
    MOVE.L  A1,(A3)+
    JSR     TestForm     ; MM2-Routine aufrufen 
    MOVEM.L (SP)+,D1-A6
  END
END testForm;

PROCEDURE fixObjs();
(* OBJECT  *tree;       A0
 * BOOLEAN is_dialog;   D0
 *)
  (* Macht nichts, braucht auch nichts anderes aufrufen *)
END fixObjs;

PROCEDURE doAlert ();
(* WORD defbut, D0
   BYTE *txt)); A0
 *)
BEGIN
  (* Es werden einfach nur die Parameter umkopiert und dann 
   * direkt mtAlerts.Alert aufgerufen, da die Parameter identisch sind.
   *)
  ASSEMBLER
    MOVEM.L D1-A6,-(SP)
    LEA     myStack,A3  ; Stack einrichten f�r MM2
    MOVE.W  D0,(A3)+    ; Default-Button
    MOVE.L  A0,(A3)+    ; String-Adresse
    MOVE.W  #255,(A3)+  ; High-Value f�r String 
    JSR     mtAlerts.Alert/
    MOVEM.L (SP)+,D1-A6
  END
END doAlert;
(*$L=*)

VAR localProcs : ARRAY[0..4] OF ADDRESS;
    rsc        : mtRsc.RESOURCE;

PROCEDURE InitObfix (init : BOOLEAN) : ADDRESS;
  VAR voidO : BOOLEAN;
BEGIN
  IF init
  THEN
    (* Alle Module initialisieren *)
    MagicVDI.InitVDI();
    MagicAES.InitAES();
    mtAppl.InitMtAppl();
    mtArea.InitMtArea();
    mtAlerts.InitMtAlerts();
    mtMenubase.InitMtMenubase();
    mtPopups.InitMtPopups();
    mtXobjects.InitMtXobjects();
    mtRsc.InitMtRsc();
    mtDials.InitDials();
    (* Jetzt Resource relozieren *)
    voidO := mtRsc.RelocRsc (CADR  (RscData), rsc);
    (* Adressen der Prozeduren eintragen *)
    localProcs[0] := ADDRESS(fixObjs);
    localProcs[1] := ADDRESS(doAlert);
    localProcs[2] := ADDRESS(testForm);
    (* Adresse der Help-Seite eintragen *)
    localProcs[3] := mtRsc.GaddrRsc (rsc, MagicAES.RTREE, 0);
    RETURN ADR(localProcs);
  ELSE
    RETURN NIL
  END;
END InitObfix;  


(*$L-*)
PROCEDURE pInitObfix();
BEGIN
  ASSEMBLER
    MOVEM.L D1-A6,-(SP)
    LEA     myStack,A3  ; Stack einrichten f�r MM2
    MOVE.W  D0,(A3)+    ; status auf Stack
    JSR     InitObfix/  ; und M2-Initprozedur aufrufen 
    MOVEM.L (SP)+,D1-A6
  END
END pInitObfix;
(*$L=*)

VAR voidI : INTEGER;

BEGIN
  ASSEMBLER
    BRA.S   start
    LEA     m1(PC),A0               ; f�r Linker
    LEA     m2(PC),A0               ; f�r Linker
m1: DC.L    $30363130,$31393635     ; '06101965'
    SYNC
m2: DC.L    pInitObfix
start:
  END;
  voidI := mtAlerts.Alert (1,"[3][This program can|only be started from|Interface!][[Cancel]");
END ExtObFix.
